package com.mall.user.application.eventhandler;

import com.mall.user.domain.event.UserCreatedEvent;
import com.mall.user.domain.service.EmailDomainService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * 用户创建事件处理器
 * 处理用户创建后的相关业务逻辑
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class UserCreatedEventHandler {
    
    private final EmailDomainService emailDomainService;
    
    /**
     * 处理用户创建事件
     * 异步发送欢迎邮件
     */
    @Async
    @EventListener
    public void handleUserCreatedEvent(UserCreatedEvent event) {
        log.info("接收到用户创建事件: {}", event);
        
        try {
            // 发送欢迎邮件
            emailDomainService.sendWelcomeEmail(event.getUser());
            
            log.info("用户创建事件处理完成: userId={}, userName={}", 
                    event.getUserId(), event.getUserName());
                    
        } catch (Exception e) {
            log.error("处理用户创建事件失败: userId={}, userName={}, error={}", 
                    event.getUserId(), event.getUserName(), e.getMessage(), e);
            
            // 这里可以添加补偿机制，比如重试或者记录到失败队列
            handleEventProcessingFailure(event, e);
        }
    }
    
    /**
     * 处理事件处理失败的情况
     */
    private void handleEventProcessingFailure(UserCreatedEvent event, Exception e) {
        // 记录失败日志
        log.warn("用户创建事件处理失败，需要人工介入: userId={}, userName={}, error={}", 
                event.getUserId(), event.getUserName(), e.getMessage());
        
        // 这里可以实现补偿机制：
        // 1. 发送到死信队列
        // 2. 记录到数据库待重试
        // 3. 发送告警通知
        
        // 暂时只记录日志
        System.err.println("⚠️  事件处理失败通知:");
        System.err.println("   用户ID: " + event.getUserId());
        System.err.println("   用户名: " + event.getUserName());
        System.err.println("   失败原因: " + e.getMessage());
        System.err.println("   时间: " + java.time.LocalDateTime.now());
    }
}